package nocturnos.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;


import nocturnos.domain.Fiesta;
import nocturnos.domain.Grupos;
import nocturnos.domain.Persona;
import nocturnos.domain.Puntos;
import nocturnos.domain.Regalos;
import nocturnos.domain.StockRegalos;

public class JDBCFiestaDAO implements iFiestaDAO {

	//en las aplicacion no se borran festas
	public void delete(Connection con, String fiestaOID) {
/**
		// TODO Auto-generated method stub
		String sql = "DELETE FROM fiesta WHERE (OID = ?) ";
        PreparedStatement stmt = null;
        
        try {
            stmt = con.prepareStatement(sql);
            stmt.setString(1, fiestaOID);
            stmt.executeUpdate();
        } catch (SQLException e) {
            System.err.println("Message: " + e.getMessage());
            System.err.println("SQLState: " + e.getSQLState());
            System.err.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException e) {
            }
        }

	*/	
	}
// no hay inserts
	
	@Override
	public void insert(Connection con, String fiestaOID, Fiesta f) {
	/**
		// TODO Auto-generated method stub
		
		String sql = "INSERT INTO fiesta ( OID, localFiesta, gruposOID, numGruposEnFiesta) VALUES (?, ?, ?, ?) ";
        PreparedStatement stmt = null;

        try {
            stmt = con.prepareStatement(sql);

            stmt.setString(1, fiestaOID);
            stmt.setString(2, f.getLocal());
            stmt..setString(3, f.getGruposEnFiesta().get(1)); //revisar
            stmt.setInt(4, f.getNumGruposEnFiesta() ); // revisar posibilidad de eliminar atributo
            

            stmt.executeUpdate();

        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }

*/		
	}

	@Override
	public Fiesta select(Connection con, String localFiesta) {
		// TODO Auto-generated method stub

        String sql = "SELECT DISTINCT fiesta.localFiesta, grupos.idGrupo, horaLlegada, horaSalida FROM fiesta, grupos, personas where fiesta.localFiesta=? AND fiesta.gruposOID and grupos.ocupantes = personas.OID ORDER BY grupos.idGrupo;";
        PreparedStatement stmt = null;
        ResultSet result = null;
        Fiesta f = null;

        try {
            stmt = con.prepareStatement(sql);
            stmt.setString(1, localFiesta);

            result = stmt.executeQuery();

            result.next();
            f = new Fiesta();
            f.setLocal(result.getString("localFiesta"));
            result = stmt.executeQuery();
            //result.first();
            List<Grupos> listaGrupos = new LinkedList<Grupos>();
            while(result.next()){
            	Integer idGrupo=result.getInt("idGrupo");
            	Integer horaLlegada = result.getInt("horaLlegada");
            	Integer horaSalida = result.getInt("horaSalida");
            	//obtencion de los ocupantes
            	List<Persona> per = new LinkedList<Persona>();
            	per =  Selectpersonas(con, localFiesta, idGrupo);
            	//obtencion del conductor
            	Iterator iper = per.iterator();
            	Persona persona = new Persona();
            	boolean encontradoconductor = false;
            	while(iper.hasNext() && encontradoconductor==false){
            		persona = (Persona)iper.next();
            		if (persona.isConductor()==true){
            			encontradoconductor=true;
            		}
            	}
            	Grupos grupo = new Grupos(idGrupo, per, persona, horaLlegada, horaSalida);
            	listaGrupos.add(grupo);
            }
           f.setGruposEnFiesta(listaGrupos);
            /** 
            f.setGruposEnFiesta(result.getString("gruposEnFiesta"));
            */
            //insertar lista de grupos en fiesta
            
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }

        return f;
    }
		
		
	
	
	private List<Persona> Selectpersonas(Connection con, String localFiesta, int idGrupo){
		
		
			String sql2 = "SELECT DISTINCT localFiesta, grupos.idGrupo, idPersona, nombre, apellidos, direccion, localidad, zip, provincia, personas.conductor, puntosOID FROM fiesta, grupos, personas where fiesta.localFiesta=? AND fiesta.gruposOID and grupos.ocupantes = personas.OID AND grupos.idGrupo = ? ORDER BY grupos.idGrupo, personas.idPersona;";
            PreparedStatement stmt2 = null;
            ResultSet result2 = null;
            List<Persona> listaPersonas = null;
            
      try{    	
			stmt2 = con.prepareStatement(sql2);
            stmt2.setString(1, localFiesta);
            stmt2.setInt(2, idGrupo);
            result2 = stmt2.executeQuery();
            
            listaPersonas = new LinkedList<Persona>();
            while(result2.next()){
            	Integer idPersona = result2.getInt("idPersona");
            	String nombre = result2.getString("nombre");
            	String apellidos = result2.getString("apellidos");
            	String direccion = result2.getString("direccion");
            	String localidad = result2.getString("localidad");
            	String zip = result2.getString("zip");
            	String provincia = result2.getString("provincia");
            	boolean conductor = result2.getBoolean("conductor");
            	String idPuntos = result2.getString("puntosOID");
            	//funcion puntos
            	Puntos puntosPersona = new Puntos();
            	puntosPersona = Selectpuntos(con, localFiesta, idGrupo, idPersona, idPuntos);
            	Persona per = new Persona(idPersona, nombre, apellidos, direccion,localidad,zip,provincia,conductor, puntosPersona);
            	listaPersonas.add(per);	
            }
    		
    		
	}catch (SQLException e) {
        System.out.println("Message: " + e.getMessage());
        System.out.println("SQLState: " + e.getSQLState());
        System.out.println("ErrorCode: " + e.getErrorCode());
    } finally {
        try {
            if (result2 != null) {
                result2.close();
            }
            if (stmt2 != null) {
                stmt2.close();
            }
        } catch (SQLException e) {
        }
    }


		
		
	
		
		
		
		return listaPersonas;		
	}
	

	private Puntos Selectpuntos(Connection con, String localFiesta, int idGrupo, int idPersona, String idPuntos){
		
		
		String sql2 = "SELECT DISTINCT localFiesta, grupos.IdGrupo, puntos.OID, totalPuntos FROM fiesta, grupos, personas, puntos where fiesta.localFiesta=? AND fiesta.gruposOID and grupos.conductor = personas.idPersona AND grupos.idGrupo=? AND personas.puntosOID=? ORDER BY grupos.idGrupo;";
        PreparedStatement stmt2 = null;
        ResultSet result2 = null;
        Puntos p=null;
        
    try{    	
		stmt2 = con.prepareStatement(sql2);
        stmt2.setString(1, localFiesta);
        stmt2.setInt(2, idGrupo);
        stmt2.setString(3, idPuntos);
        result2 = stmt2.executeQuery();
        
        p = new Puntos();
        while(result2.next()){
        	Integer idGrup = result2.getInt("idGrupo");
        	Integer totalPuntos = result2.getInt("totalPuntos");
        	p.setIdGrupo(idGrup);
        	p.setTotalPuntos(totalPuntos);
        	
        	//String idRegalo = result2.getString("regaloGanado");
        	//introduccion del regalo regalos
        	
        	//Selectregalos(con, localFiesta, idGrupo, idPersona, idPuntos, idRegalo);
        	
        	
        }
		
		
}catch (SQLException e) {
    System.out.println("Message: " + e.getMessage());
    System.out.println("SQLState: " + e.getSQLState());
    System.out.println("ErrorCode: " + e.getErrorCode());
} finally {
    try {
        if (result2 != null) {
            result2.close();
        }
        if (stmt2 != null) {
            stmt2.close();
        }
    } catch (SQLException e) {
    }
}


	
	

	
	
	
	return p;		
}
	

	
	
/**	
private Regalos Selectregalos(Connection con, String localFiesta, int idGrupo, int idPersona, String idPuntos, String idRegalos){
		
		
		String sql2 = "SELECT * FROM fiesta, grupos, personas where fiesta.localFiesta=? AND fiesta.gruposOID and grupos.ocupantes = personas.OID AND grupos.idGrupos = ? AND persona.puntosOID=? AND puntos.regaloGanado;";
        PreparedStatement stmt2 = null;
        ResultSet result2 = null;
        Regalos r=null;
        
    try{    	
		stmt2 = con.prepareStatement(sql2);
        stmt2.setString(1, localFiesta);
        stmt2.setInt(2, idGrupo);
        stmt2.setString(3, idPuntos);
        r = new Regalos(1);
        
        while(result2.next()){
        	Integer puntos = result2.getInt("puntosRegalo");
        	Integer nombreRegalo = result2.getInt("nombreRegalo");
        	
        }
		
		
}catch (SQLException e) {
    System.out.println("Message: " + e.getMessage());
    System.out.println("SQLState: " + e.getSQLState());
    System.out.println("ErrorCode: " + e.getErrorCode());
} finally {
    try {
        if (result2 != null) {
            result2.close();
        }
        if (stmt2 != null) {
            stmt2.close();
        }
    } catch (SQLException e) {
    }
}


	
	

	
	
	
	return r;		
}	
	
	
	*/
}
